﻿using System;
using System.Collections.Generic;
using System.Linq;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Interfaces.Repositories;

namespace GigaSite.Domain.DAL.Repositories
{
    /// <summary>
    /// СУБД реализация репозитория Торговых Центров
    /// </summary>
    public class ShoppingMallsRepository: BaseRepository<ShoppingMall>, IShoppingMallsRepository
    {
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="dataContext">Контекст данных</param>
        public ShoppingMallsRepository(GigaDataContext dataContext) : base(dataContext)
        {
        }


        /// <summary>
        /// Загружает указанную сущность по ее идентификатору
        /// </summary>
        /// <param name="id">Идентификатор сущности</param>
        /// <returns>Сущность с указанным идентификатором или Null</returns>
        public override ShoppingMall Load(long id)
        {
            return Find(m => m.Id == id);
        }

        /// <summary>
        /// Получает негеокодированные торговые центры
        /// </summary>
        /// <returns>Коллекция торговых центров с отсутствующими координатами</returns>
        public IEnumerable<ShoppingMall> GetUngeocodedShoppingMalls()
        {
            return Search(m => m.Latitude == 0 && m.Longitude == 0);
        }

        /// <summary>
        /// Удаляет сущность из репозитория
        /// </summary>
        /// <param name="entity">Сущность для удаления</param>
        public override void Delete(ShoppingMall entity)
        {
            // Удаляем так же все связи которые есть у сущности
            DataContext.CompanyToShoppingMallMappings.DeleteAllOnSubmit(DataContext.CompanyToShoppingMallMappings.Where(m => m.ShoppingMallId == entity.Id));
            base.Delete(entity);
        }

        /// <summary>
        /// Получает связи указанного торгового центра с компаниями
        /// </summary>
        /// <param name="shoppingMall">Торговый центр</param>
        /// <returns>Коллекция объектов связей</returns>
        public IEnumerable<Company> GetOrganizationsInShoppingMall(ShoppingMall shoppingMall)
        {
            return
                DataContext.CompanyToShoppingMallMappings.Where(m => m.ShoppingMallId == shoppingMall.Id).Select(
                    m => m.CompanyId).Select(m => DataContext.Companies.FirstOrDefault(c => c.Id == m));
        }
    }
}